﻿#include "code_convert.h"

/*多字符转换为宽字符 --- ANSI -to- Unicode*/
wchar_t *ANSIToUnicode(const char *str) {
    size_t   textlen;
    wchar_t *result;
    textlen = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
    result  = (wchar_t *)malloc((textlen + 1) * sizeof(wchar_t));
    if (nullptr != (result = (wchar_t *)malloc((textlen + 1) * sizeof(wchar_t)))) {
        memset(result, 0, (textlen + 1) * sizeof(wchar_t));
        MultiByteToWideChar(CP_ACP, 0, str, -1, (LPWSTR)result, textlen);
        return result;
    }
    return 0;
}

/*宽字符转换为多字符 --- Unicode -to- ANSI*/
char *UnicodeToANSI(const wchar_t *str) {
    char  *result;
    size_t textlen;
    textlen = WideCharToMultiByte(CP_ACP, 0, str, -1, NULL, 0, NULL, NULL);
    result  = (char *)malloc((textlen + 1) * sizeof(char));
    if (nullptr != result) {
        memset(result, 0, sizeof(char) * (textlen + 1));
        WideCharToMultiByte(CP_ACP, 0, str, -1, result, textlen, NULL, NULL);
        return result;
    }
    return 0;
}

/*UTF8转换为宽字符 --- UTF8 -to- Unicode */
wchar_t *UTF8ToUnicode(const char *str) {
    size_t   textlen;
    wchar_t *result;
    textlen = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0);
    result  = (wchar_t *)malloc((textlen + 1) * sizeof(wchar_t));
    if (nullptr != result) {
        memset(result, 0, (textlen + 1) * sizeof(wchar_t));
        MultiByteToWideChar(CP_UTF8, 0, str, -1, (LPWSTR)result, textlen);
        return result;
    }
    return 0;
}

/*宽字符转换为UTF8 --- Unicode -to- UTF8 */
char *UnicodeToUTF8(const wchar_t *str) {
    char  *result;
    size_t textlen;
    textlen = WideCharToMultiByte(CP_UTF8, 0, str, -1, NULL, 0, NULL, NULL);
    result  = (char *)malloc((textlen + 1) * sizeof(char));
    if (nullptr != result) {
        memset(result, 0, sizeof(char) * (textlen + 1));
        WideCharToMultiByte(CP_UTF8, 0, str, -1, result, textlen, NULL, NULL);
        return result;
    }
    return 0;
}

/*多字符转换为UTF8 --- Unicode -to- UTF8 */
char *ANSIToUTF8(const char *str) {
    return UnicodeToUTF8(ANSIToUnicode(str));
}

/*UTF8转换为多字符 --- UTF8 -to- ANSI */
char *UTF8ToANSI(const char *str) {
    return UnicodeToANSI(UTF8ToUnicode(str));
}